package cn.tedu.springmvc2.exception;

import cn.tedu.springmvc2.response.JsonResult;
import cn.tedu.springmvc2.response.StatusCode;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;

@RestControllerAdvice
@Slf4j
/**
 * @Slf4j是Lombok提供的一种注解，
 * 主要用于在类中自动生成一个名为log的日志对象。
 * 可以方便地在代码中使用日志功能，
 * 而无需手动创建和初始化日志对象。
 * 在类上添加了@Slf4j注解之后，就可以直接在代码中使用log对象进行日志输出，
 * 例如调用log.debug()、log.info()等方法。
 * */
public class GlobaExceptionHandler {
    // 使用@ExceptionHandler注解来处理IllegalArgumentException异常
    @ExceptionHandler(IllegalArgumentException.class)
    public JsonResult doHandleIllegalArgumentException(IllegalArgumentException e) {
        // 使用log对象记录一个警告级别的日志（通过@Slf4j注解）
        // 警告信息包含异常的消息内容
        log.warn("IllegalArgumentException msg is {}", e.getMessage());
        // 创建一个JsonResult对象，包含状态码和异常的消息
        // 这个JsonResult对象将作为响应返回给客户端
        return new JsonResult(StatusCode.OPERATION_FAILED, e.getMessage());
    }

    // 使用@ExceptionHandler注解来处理RuntimeException异常
    @ExceptionHandler(RuntimeException.class)
    public JsonResult doHandleRuntimeException(RuntimeException e) {
        // 使用log对象记录一个错误级别的日志，表示RuntimeException发生
        log.error("RuntimeException msg is {}", e.getMessage());
        // 创建一个JsonResult对象，包含状态码和异常的消息
        // 这个JsonResult对象将作为响应返回给客户端
        return new JsonResult(StatusCode.OPERATION_FAILED, e.getMessage());
    }

    // 使用@ExceptionHandler注解来处理Throwable异常，这是所有错误和异常的根类
    @ExceptionHandler(Throwable.class)
    public JsonResult handleThrowable(Throwable e) {
        // 返回一个JsonResult对象，状态码为StatusCode.OPERATION_FAILED，并带有固定的错误消息
        // 这里并没有记录日志，因为Throwable可能是一个严重的问题，记录日志可能无法正常工作
        return new JsonResult(StatusCode.OPERATION_FAILED, "程序运行过程中出现了Throwable");
    }
}
